package com.zhang;


import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.http.HttpMethodName;
import com.qcloud.cos.region.Region;
import com.tencent.cloud.CosStsClient;
import com.tencent.cloud.Credentials;
import com.tencent.cloud.Response;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

@Component
public class CosService implements InitializingBean {


    @Value("${cos.appId}")
    private String appId;
    @Value("${cos.secretId}")
    private String secretId;
    @Value("${cos.secretKey}")
    private String secretKey;
    @Value("${cos.region}")
    private String regionName;

    @Value("${cos.bucktName}")
    private String bucketName;

    private COSClient cosClient;


    @Override
    public void afterPropertiesSet() throws Exception {
        BasicCOSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

        Region region = new Region(regionName);
        ClientConfig clientConfig = new ClientConfig(region);

        cosClient = new COSClient(cred, clientConfig);
    }


    /**
     * 获取临时上传凭证
     */
    public Response getTempCredential() throws Exception {
        TreeMap<String, Object> config = new TreeMap<String, Object>();

        // 云 api 密钥 SecretId
        config.put("secretId", secretId);
        // 云 api 密钥 SecretKey
        config.put("secretKey", secretKey);
        // 临时密钥有效时长，单位是秒
        config.put("durationSeconds", 1800);
        // 换成你的 bucket
        config.put("bucket", bucketName);
        // 换成 bucket 所在地区
        config.put("region", regionName);

        // 可以通过 allowPrefixes 指定前缀数组, 例子： a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
        config.put("allowPrefixes", new String[] {
                "video/*",
                "img/*",
                "videoCover/*"
        });


        // 密钥的权限列表。简单上传和分片需要以下的权限，其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
        String[] allowActions = new String[] {
                // 简单上传
                "name/cos:PutObject",
                "name/cos:PostObject",
                // 分片上传
                "name/cos:InitiateMultipartUpload",
                "name/cos:ListMultipartUploads",
                "name/cos:ListParts",
                "name/cos:UploadPart",
                "name/cos:CompleteMultipartUpload"
        };
        config.put("allowActions", allowActions);

        Response response = CosStsClient.getCredential(config);

        return response;
    }

    public String getTempUploadUrl(String objectName) {
        // 设置签名过期时间(可选), 若未进行设置则默认使用 ClientConfig 中的签名过期时间(1小时)
        // 这里设置签名在半个小时后过期
        Date expirationDate = new Date(System.currentTimeMillis() + 30 * 60 * 1000);

        // 填写本次请求的参数，需与实际请求相同，能够防止用户篡改此签名的 HTTP 请求的参数
//        Map<String, String> params = new HashMap<String, String>();
//        params.put("param1", "value1");

        // 填写本次请求的头部，需与实际请求相同，能够防止用户篡改此签名的 HTTP 请求的头部
//        Map<String, String> headers = new HashMap<String, String>();
//        headers.put("header1", "value1");


        // 请求的 HTTP 方法，上传请求用 PUT，下载请求用 GET，删除请求用 DELETE
        HttpMethodName method = HttpMethodName.PUT;

        URL url = cosClient.generatePresignedUrl(bucketName, objectName, expirationDate,method);

        return url.toString();
    }

    /**
     * https://cloud.tencent.com/document/product/436/57316
     * 如果您的文件是私有读权限，那么本接口生成的 URL 不能直接用于访问资源。
     * @param keyName object的key值
     * @param bucketName 存储桶名称
     * @return 对象访问url
     */
    public String getObjectUrl(String keyName, String bucketName) {
        URL objectUrl = cosClient.getObjectUrl(bucketName, keyName);
        return objectUrl.toString();
    }
}
